package br.com.esporte.view.site.component.listaRegra;

import java.util.List;

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.Model;

import br.com.esporte.model.Regra;
import br.com.esporte.model.TipoRegraEnum;
import br.com.esporte.view.infra.html.HtmlParam;
import br.com.esporte.view.site.component.tipoEsporte.TipoEsporteAbstract;

/**
 * 
 * @author Milton Domingues
 *
 */
public abstract class ListRegraComponent extends TipoEsporteAbstract {

	private static final long serialVersionUID = -3041310943928809815L;

	private static final String LIST_REGRA_ID = "listRegra";
	private static final String CONTAINER_REGRA = "bg-regra-";
	private static final String CONTAINER_REGRA_ID = "containerRegra";
	private static final String TIPO_REGRA = "tipoRegra";
	private static final String NOME_REGRA_LIST = "nomeRegraList";
	private static final String DESCRICAO_REGRA_LIST = "descricaoRegraList";
	private static final String LINK_EDITAR_ID = "linkEditar";

	private List<Regra> regras;

	public ListRegraComponent(String id, List<Regra> regras) {
		super(id);
		this.regras = regras;
		montarComponente();
	}

	public abstract void acaoEditar(Regra regra);

	private SimpleAttributeModifier criarClassStyleTipoRegra(TipoRegraEnum tipoRegra){
		StringBuilder classStyle = new StringBuilder(CONTAINER_REGRA);
		classStyle.append(tipoRegra.getCodigo());
		return new SimpleAttributeModifier(HtmlParam.CLASS, classStyle.toString());
	}

	private ListView<Regra> criarListaRegras(){

		ListView<Regra> list = new ListView<Regra>(LIST_REGRA_ID, getRegras()) {

			private static final long serialVersionUID = 1L;

			@Override
			protected void populateItem(ListItem<Regra> item) {

				final Regra regra = (Regra) item.getDefaultModelObject();

				WebMarkupContainer containerPerfil = new WebMarkupContainer(CONTAINER_REGRA_ID);
				containerPerfil.add(new AttributeAppender(HtmlParam.CLASS, new Model<String>(getClassTipoEsporteBgGrande(regra.getGrupo().getTipo())), " "));

				WebMarkupContainer tipoRegra = new WebMarkupContainer(TIPO_REGRA);
				tipoRegra.add(criarClassStyleTipoRegra(regra.getTipo()));
				containerPerfil.add(tipoRegra);

				Label nome = new Label(NOME_REGRA_LIST, regra.getNome());
				nome.add(criarAppenderClassTipo(regra.getGrupo().getTipo()));

				Label descricao = new Label(DESCRICAO_REGRA_LIST, regra.getDescricao());
				descricao.add(criarAppenderClassTipo(regra.getGrupo().getTipo()));

				Link<Regra> link = new Link<Regra>(LINK_EDITAR_ID, new Model<Regra>(regra)) {
					private static final long serialVersionUID = -8674807260301700339L;
					@Override
					public void onClick() {
						acaoEditar(getModelObject());
					}
				};
				link.setVisible(habilitarEdicao());

				item.add(containerPerfil);
				item.add(nome);
				item.add(descricao);
				item.add(link);
			}

		};

		return list;
	}

	public List<Regra> getRegras() {
		return regras;
	}

	public abstract boolean habilitarEdicao();

	@Override
	public void montarComponente() {
		add(criarListaRegras());
	}

	public void setRegras(List<Regra> regras) {
		this.regras = regras;
	}

}
